#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <sys/stat.h>
#include <string>
#include <cerrno>
#include <string.h>
 
int main(int argc, char const *argv[])
{
    int fd;
    std::string pathname = "/tmp/fifo_test_for_demo";
    // 创建一个有名管道
    if (mkfifo(pathname.c_str(), 0664) == -1) { //0664表示文件权限
        if (errno != EEXIST) {
            // 如果不是因为文件已存在而失败，则输出错误信息并退出
            std::cerr << "mkfifo: " << strerror(errno) << std::endl;
            return EXIT_FAILURE;
        }
    }
    // 打开文件描述符
    // 对有名管道的特殊文件 创建fd
    fd = open(pathname.c_str(), O_WRONLY);
    if (fd == -1) {
        std::cerr << "open: " << strerror(errno) << std::endl;
        return EXIT_FAILURE;
    }
    // 写入数据
    // 从标准输入中读取数据写入到管道中
    char buf[100];
    ssize_t numRead;
    while ((numRead = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
        // 读到数据
        if (write(fd, buf, numRead) != numRead) {
            std::cerr << "write: " << strerror(errno) << std::endl;
            close(fd);
            return EXIT_FAILURE;
        }
    }
    if (numRead == -1) {
        std::cerr << "read: " << strerror(errno) << std::endl;
        close(fd);
        return EXIT_FAILURE;
    }
    std::cout << "写入数据成功,无异常，发送数据到管道" << std::endl;
    close(fd);
    // 删除有名管道 释放资源
    if (unlink(pathname.c_str()) == -1) {
        std::cerr << "unlink: " << strerror(errno) << std::endl;
    }
    return 0;
}